package cn.kt.test;

import cn.kt.domin.Person;

import java.util.Optional;

/**
 * Created by tao.
 * Date: 2021/9/6 13:25
 * 描述:  Optional类使用
 */
public class Demo8 {
    public static void main(String args[]) {
        Demo8 demo8 = new Demo8();
        demo8.optionalTest1Of();
        demo8.optionalTest2OfNullable();
        demo8.optionalTest3Get();
        demo8.optionalTest4IsPresent();
        demo8.optionalTest5IfPresent();
        demo8.optionalTest6OrElse();
        demo8.optionalTest7OrElseGet();
        demo8.optionalTest8OrElseThrow();
        demo8.optionalTest9Filter();

    }

    /**
     * 1. of方法测试：返回一个指定Optional的非空值，如果是控制，会报NullPointException。
     */
    public void optionalTest1Of() {
        Person person1 = new Person();
        Person person2 = new Person();
        person2.setName("张三");
        Person person3 = null;
        Optional<Person> user1 = Optional.of(person1);
        Optional<Person> user2 = Optional.of(person2);
        // 打印空user对象
        System.out.println("person1:" + user1.toString());
        // 打印name = 张三的user对象
        System.out.println("person2:" + user2.toString());
        // NullPointerException
        Optional<Person> user3 = Optional.of(person3);
    }


    /**
     * 2. ofNullable测试：返回一个Optional描述的指定值，如果为空，则返回Optional。
     */
    public void optionalTest2OfNullable() {
        Person u1 = new Person();
        Person u2 = new Person();
        u2.setName("张三");
        Person u3 = null;
        Optional<Person> u11 = Optional.ofNullable(u1);
        Optional<Person> u12 = Optional.ofNullable(u2);
        Optional<Person> u13 = Optional.ofNullable(u3);
        // 打印空user对象
        System.out.println("u11:" + u11.toString());
        // 打印name = 张三的user对象
        System.out.println("u12:" + u12.toString());
        // 打印empty
        System.out.println("u13:" + u13.toString());
        // 可以抛出自定义异常
        Optional.ofNullable(u3).orElseThrow(NullPointerException::new);
    }

    /**
     * 3. get测试：如果Optional存在一个值，则返回，不存在则抛出NoSuchElementException。
     */
    public void optionalTest3Get() {
        Person u2 = new Person();
        u2.setName("张三");
        Person u3 = null;
        Person user2 = Optional.ofNullable(u2).get();
        // 打印name = 张三的Person对象
        System.out.println("user2:" + user2);
        // NoSuchElementException
        Person user3 = Optional.ofNullable(u3).get();
        System.out.println("user3:" + user3);
    }

    /**
     * 4. isPresent测试：如果有值返回true，如果为null返回false。
     */
    public void optionalTest4IsPresent() {
        Person u2 = new Person();
        u2.setName("张三");
        Person u3 = null;
        boolean booleanUser2 = Optional.ofNullable(u2).isPresent();
        boolean booleanUser3 = Optional.ofNullable(u3).isPresent();
        // true
        System.out.println("booleanUser2:" + booleanUser2);
        // false
        System.out.println("booleanUser3:" + booleanUser3);
    }

    /**
     * 5. ifPresent测试：该方法也可以检测是否为null，同时该方法还可以接受一个Consumer参数。
     */
    public void optionalTest5IfPresent() {
        Person u2 = new Person();
        u2.setName("张三");
        Optional.ofNullable(u2).ifPresent(user -> user.setAge(21));
        // 21
        System.out.println("u2:" + u2.getAge());
    }

    /**
     * 6. orElse测试：如果返回值存在则返回，否则返回other。
     */
    public void optionalTest6OrElse() {
        Person u2 = new Person();
        u2.setName("张三");
        Person u3 = null;
        Person user = Optional.ofNullable(u3).orElse(u2);
        // 打印u2对象
        System.out.println("user:" + user.toString());
    }

    /**
     * 7. orElseGet测试：如果有值则返回，没有则调用Supplier函数，并返回。
     */
    public void optionalTest7OrElseGet() {
        Person u2 = new Person();
        u2.setName("张三");
        Person u3 = null;
        Person user1 = Optional.ofNullable(u3).orElseGet(() -> new Person());
        Person user2 = Optional.ofNullable(u3).orElseGet(() -> u2);
        // 打印Person空对象
        System.out.println("user1:" + user1.toString());
        // u2对象
        System.out.println("user2:" + user2.toString());
    }

    /**
     * 8. orElseThrow：有值时返回该值，没有时则抛出异常。
     */
    public void optionalTest8OrElseThrow() {
        Person u1 = null;
        Person u2 = new Person();
        u2.setName("张三");
        Person user2 = Optional.ofNullable(u2).orElseThrow(() -> new IllegalStateException());
        // 打印u2对象
        System.out.println("user2:" + user2.toString());
        // IllegalStateException
        Person user1 = Optional.ofNullable(u1).orElseThrow(() -> new IllegalStateException());
    }

    /**
     * 9. filter测试：接受一个Predicate参数，返回测试结果为true的值。如果测试结果为false，会返回一个空的 Optional。
     */
    public void optionalTest9Filter() {
        Person user = new Person();
        user.setName("张三");
        user.setAge(11);
        Person user1 = Optional.ofNullable(user).filter(u -> u.getName().equals("张三") && u.getAge() == 11).orElseThrow(() -> new NullPointerException());
        // Person对象
        System.out.println("user1:" + user1);
        // NullPointerException
        Person user2 = Optional.ofNullable(user).filter(u -> u.getName().equals("张三") && u.getAge() == 22).orElseThrow(() -> new NullPointerException());
        System.out.println("user2:" + user2);
    }


}

